home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / seeports / seeports.asm next >
Assembly Source File  |  1990-03-31  |  6KB  |  492 lines

  1. cseg    segment
  2.     assume cs:cseg,ds:cseg
  3.     org 100h
  4. start:
  5.     jmp initialize
  6.  
  7. old_keyboard_io dd 0,0
  8.  
  9.     assume ds:nothing
  10. new_keyboard_io     proc    far
  11.     sti
  12.     cmp    ah,0
  13.     je    ksread
  14.     jmp    old_keyboard_io
  15. ksread:
  16.     call    keyread
  17.     iret
  18. new_keyboard_io        endp
  19.  
  20. keyread        proc     near
  21.     push    si
  22. readchar:
  23.     pushf
  24.     call old_keyboard_io
  25.     cmp    al,0
  26.     je    extended
  27.     jmp    readdone
  28. extended:
  29.     mov    si,offset keytab
  30. nextext:
  31.     cmp    byte ptr cs:[si],0
  32.     je    readdone
  33.     cmp    ah,cs:[si]
  34.     je    startexpand
  35.     add    si,3
  36.     jmp    nextext
  37. startexpand:
  38.     add    si,1
  39.     cmp    word ptr cs:[si],0
  40.     je    readdone
  41.     push    ax
  42.     push    bx
  43.     push    cx
  44.     push    dx
  45.     push     si
  46.     push    di
  47.     push    bp
  48.     push    ds
  49.     and     ah,1
  50.     add    ah,ah
  51.     mov    bl,ah
  52.     mov    bh,04
  53.     mov    ax,0000
  54.     mov    ds,ax
  55.     cmp     word ptr [bx],0
  56.     je    skip
  57.     mov    bl,49h
  58.     mov    ax,0b800h
  59.     cmp     byte ptr [bx],7
  60.     jne    other1
  61.     mov    ax,0b000h
  62. other1: mov    cs:vaddr,ax
  63.     call     word ptr cs:[si]
  64. skip:    pop    ds
  65.     pop    bp
  66.     pop    di
  67.     pop    si
  68.     pop    dx
  69.     pop    cx
  70.     pop    bx
  71.     pop    ax
  72. readdone:
  73.     pop    si
  74.     ret
  75. keyread        endp
  76.  
  77. keytab    db    120        ; alt-1
  78.     dw    port1status
  79.     db    121        ; alt-2
  80.     dw    port2status
  81.     db    0
  82.     dw    0
  83. toggle  db    0
  84.  
  85.     assume    cs:cseg,ds:cseg
  86.  
  87. port1status    proc near
  88.     mov    bx,cs
  89.     mov    ds,bx
  90.     mov    dh,3
  91.     call     portstatus
  92.     ret
  93. port1status    endp
  94.  
  95. port2status    proc near
  96.     mov    bx,cs
  97.     mov    ds,bx
  98.     mov    dh,2
  99.     call     portstatus
  100.     ret
  101. port2status    endp
  102.  
  103.  
  104. portstatus    proc near
  105.     push    bx
  106.     call    getpos
  107.     push    bx
  108.     mov    bx,0
  109.     call     setpos
  110. doshow: cmp    toggle,dh    ; same as last hot key?
  111.         jne    newinfo        ; no then skip
  112.     call    restore98    ; else try to restore your data
  113.     jnz    newinfo         ; unless screen has scrolled.
  114.     mov    toggle,0        ; if restored, just clear hot-key toggle
  115.     jmp    bye
  116. newinfo:
  117.     call    save98        ; captures if its your data
  118.     mov    toggle,dh
  119.     call     showcom
  120.     call    showbaud
  121.     call    showlen
  122.     call    showstop
  123.     call    showparity
  124. bye:
  125.     pop    bx
  126.     call    setpos
  127.     pop    bx
  128.     ret
  129. portstatus    endp
  130.  
  131. pad    db    98 dup(32)
  132. signat    db    ' bits/char, '
  133.  
  134. save98    proc near
  135.         push    ax
  136.     push    bx
  137.     push    es
  138.     push    di
  139.     mov    ax,vaddr
  140.     mov    es,ax
  141.     mov    di,36
  142.     mov    bx,0
  143. qchk:    mov    ah,es:[di]
  144.     cmp    ah,signat[bx]
  145.     jne    sok
  146.     inc    di
  147.     inc    di
  148.     inc    bx
  149.     cmp    bx,12
  150.     jne    qchk
  151.     jmp    sdone
  152. sok:    mov    di,0
  153.     mov    bx,0
  154. sloop:    mov    ah,es:[di]
  155.     mov    pad[bx],ah
  156.     inc    bx
  157.     inc    di
  158.     cmp    bx,98    ; 98 bytes yet?
  159.     jne    sloop
  160. sdone:    pop    di
  161.     pop    es
  162.     pop    bx
  163.     pop    ax
  164.     ret
  165. save98    endp
  166.  
  167.  
  168. restore98    proc near
  169.     push    ax
  170.     push    bx
  171.     push    es
  172.     push    di
  173.     mov    ax,vaddr
  174.     mov    es,ax
  175.     mov    di,36
  176.     mov    bx,0
  177. sigchk:    mov    ah,es:[di]
  178.     cmp    ah,signat[bx]
  179.     jne    rdone
  180.     inc    di
  181.     inc    di
  182.     inc    bx
  183.     cmp    bx,12
  184.     jne    sigchk
  185.     mov    di,0
  186.     mov    bx,0
  187. rloop:    mov    ah,pad[bx]
  188.     mov    es:[di],ah
  189.     inc    bx
  190.     inc    di
  191.     cmp    bx,98    ; 98 bytes yet?
  192.     jne    rloop
  193. rdone:    pop    di
  194.     pop    es
  195.     pop    bx
  196.     pop    ax
  197.     ret
  198. restore98    endp
  199.  
  200.  
  201.     dec    cx
  202.  
  203.  
  204. com1    db    'COM1: ',0
  205. com2    db    'COM2: ',0
  206. comtab    dw    com1
  207.     dw    com2
  208.     dw    0
  209.  
  210.  
  211. showcom        proc near
  212.     push    bx
  213.     push    dx
  214.     push    si
  215.     mov    bh,0
  216.     mov    bl,3
  217.     sub    bl,dh
  218.     shl    bx,1
  219.     mov    si,comtab[bx]
  220.     call    dstring
  221.     pop    si
  222.     pop    dx
  223.     pop    bx
  224.     ret
  225. showcom        endp
  226.  
  227. vaddr    dw    0000h
  228. b110    db    ' 110 baud, ',0
  229. b300    db    ' 300 baud, ',0
  230. b1200    db    '1200 baud, ',0
  231. b2400    db    '2400 baud, ',0
  232. b4800    db    '4800 baud, ',0
  233. b9600    db    '9600 baud, ',0
  234.  
  235. divtab    dw    1047
  236.     dw    384
  237.     dw    96
  238.     dw    48
  239.     dw    24
  240.     dw    12
  241.     dw    0
  242.  
  243. baudtab dw    b110
  244.     dw    b300
  245.     dw    b1200
  246.     dw    b2400
  247.     dw    b4800
  248.     dw    b9600
  249.     dw    0
  250.  
  251. showbaud    proc near
  252.     push    di
  253.     push    si
  254.     push    bx
  255.     call     getbaud
  256.     mov    di,0
  257. baudloop:
  258.     cmp    divtab[di],0
  259.     je    bldone
  260.     cmp    bx,divtab[di]
  261.     je    dbaud
  262.     add    di,2
  263.     jmp    baudloop
  264. dbaud:
  265.     mov    si,baudtab[di]
  266.     call    dstring
  267. bldone:    
  268.     pop    bx
  269.     pop    si
  270.     pop    di
  271.     ret
  272. showbaud    endp
  273.  
  274.  
  275. getbaud        proc near
  276.     push    ax
  277.     push    dx
  278.     mov    dl,0fbh
  279.     in    al,dx
  280.     push    ax
  281.     or     al,80h
  282.     out    dx,al
  283.     mov    dl,0f8h
  284.     in    al,dx
  285.     mov    bl,al
  286.     mov    dl,0f9h
  287.     in     al,dx
  288.     mov    bh,al
  289.     pop    ax
  290.     mov    dl,0fbh
  291.     out    dx,al
  292.     pop    dx
  293.     pop    ax
  294.     ret
  295. getbaud    endp
  296.  
  297.  
  298. char7    db    '7 bits/char, ',0
  299. char8    db    '8 bits/char, ',0
  300. chartab    dw    char7
  301.     dw    char8
  302.     dw     0
  303.  
  304. showlen    proc near
  305.     push    ax
  306.     push    bx
  307.     push    si
  308.     call    getlen
  309.     shl    bx,1
  310.     mov    si,chartab[bx]
  311.     call    dstring
  312.     pop    si
  313.     pop    bx
  314.     pop    ax
  315.     ret
  316. showlen    endp
  317.  
  318.  
  319. getlen    proc near
  320.     push    ax
  321.     push    dx
  322.     mov    dl,0fbh
  323.     in     al,dx
  324.     and    al,03h
  325.     mov    bh,0
  326.     mov     bl,al
  327.     sub    bx,2
  328.     pop    dx
  329.     pop    ax
  330.     ret
  331. getlen    endp
  332.  
  333.  
  334. stop1    db    '1 stop, ',0
  335. stop2    db    '2 stop, ',0
  336. stoptab    dw    stop1
  337.     dw    stop2
  338.     dw    0
  339.  
  340. showstop    proc near
  341.     push    bx
  342.     push    si
  343.     call    getstop
  344.     dec    bx
  345.     shl    bx,1
  346.     mov    si,stoptab[bx]
  347.     call    dstring
  348.     pop    si
  349.     pop    bx
  350.     ret
  351. showstop    endp
  352.  
  353. getstop        proc    near
  354.     push    ax
  355.     push    dx
  356.     mov    bx,1
  357.     mov    dl,0fbh
  358.     in    al,dx
  359.     and    al,04h
  360.     cmp    al,0
  361.     je    gsdone
  362.     inc    bx
  363. gsdone:
  364.     pop    dx
  365.     pop    ax
  366.     ret
  367. getstop        endp
  368.  
  369. pnone    db    'no parity  ',0
  370. podd    db    'odd parity ',0
  371. peven    db    'even parity',0
  372. partab    dw    pnone
  373.     dw    podd
  374.     dw    peven
  375.     dw    0
  376.  
  377. showparity    proc    near
  378.     push    bx
  379.     push    si
  380.     call    getparity
  381.     shl    bx,1
  382.     mov    si,partab[bx]
  383.     call    dstring
  384.     pop    si
  385.     pop    bx
  386.     ret
  387. showparity    endp
  388.  
  389. getparity    proc    near
  390.     push    ax
  391.     push    cx
  392.     push    dx
  393.     mov    bx,0
  394.     mov    dl,0fbh
  395.     in    al,dx
  396.     and    al,18h
  397.     cmp    al,00h
  398.     je    gpdone
  399.     cmp    al,10h
  400.     je    gpdone
  401.     inc    bx
  402.     cmp    al,18h
  403.     jne    gpdone
  404.     inc    bx
  405. gpdone:
  406.     pop    dx
  407.     pop    cx
  408.     pop    ax
  409.     ret
  410. getparity    endp
  411.  
  412.  
  413. getpos    proc    near
  414.     push    ax
  415.     push    cx
  416.     push    dx
  417.     mov    ah,03h
  418.     mov    bh,0
  419.     int    10h
  420.     mov    bx,dx
  421.     pop    dx
  422.     pop    cx
  423.     pop    ax
  424.     ret
  425. getpos    endp
  426.  
  427. setpos    proc    near
  428.     push    ax
  429.     push    bx
  430.     push    dx
  431.     mov    ah,02h
  432.     mov    dx,bx
  433.     mov    bh,0
  434.     int     10h
  435.     pop    dx
  436.     pop    bx
  437.     pop    ax
  438.     ret
  439. setpos    endp
  440.  
  441.  
  442. dstring    proc near
  443.     push    si
  444.     push    ax
  445.     cmp    si,0
  446.     je    dsdone
  447. dloop:
  448.     mov    al,[si]
  449.     cmp    al,0
  450.     je    dsdone
  451.     call    dchar
  452.     inc    si
  453.     jmp    dloop
  454. dsdone:
  455.     pop    ax
  456.     pop    si
  457.     ret
  458. dstring    endp
  459.  
  460.  
  461. dchar    proc near
  462.     push    ax
  463.     push    bx
  464.     mov    bh,1
  465.     mov    ah,0eh
  466.     int     10h
  467.     pop    bx
  468.     pop    ax
  469.     ret
  470. dchar    endp
  471.  
  472.  
  473. ; CODE BEGINS
  474.  
  475. initialize:
  476.     assume    cs:cseg,ds:cseg
  477.     mov    bx,cs
  478.     mov    ds,bx
  479.     mov    al,16h
  480.     mov    ah,35h
  481.     int     21h
  482.     mov    word ptr cs:old_keyboard_io,bx
  483.     mov    word ptr cs:old_keyboard_io[2],es
  484.     mov    dx,offset cs:new_keyboard_io
  485.     mov    al,16h
  486.     mov    ah,25h
  487.     int     21h
  488.     mov    dx,offset initialize
  489.     int     27h
  490. cseg    ends
  491.     end    start
  492.